package o2sjsc.core.libs.io;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.os.Handler;

public class IOUtils {

	public static final ExecutorService sIOThreads = Executors
			.newScheduledThreadPool(3);

	public static byte[] toByteArray(InputStream in) throws IOException {
		ByteArrayOutputStream out = new ByteArrayOutputStream();
		pumpStream(in, out, null);
		return out.toByteArray();
	}

	public static void writeByteArrayToFile(File file, byte[] bytes)
			throws IOException {
		FileOutputStream fout = new FileOutputStream(file);
		try {
			fout.write(bytes);
		} finally {
			fout.close();
		}
	}

	public static void copyFile(File src, File dest) throws IOException {
		InputStream in = new FileInputStream(src);
		OutputStream out = new FileOutputStream(dest);
		byte[] buf = new byte[1024];
		int len;
		while ((len = in.read(buf)) > 0) {
			out.write(buf, 0, len);
		}
		in.close();
		out.close();

	}

	public interface DataProgressCallback {
		public void onDataProgress(int bytesWritten);
	}

	public static void pumpStream(InputStream in, OutputStream out,
			DataProgressCallback callback) throws IOException {
		byte[] buff = new byte[1024];
		int bytesRead = 0;
		while ((bytesRead = in.read(buff, 0, buff.length)) != -1) {
			out.write(buff, 0, bytesRead);
			if (callback != null) {
				callback.onDataProgress(bytesRead);
			}
		}
		out.close();
		in.close();
	}

	public static abstract class BackgroundTask implements Runnable {
		public Handler mHandler = new Handler();

		public abstract void doInBackground();

		public void onFinished() {

		}

		public final void run() {
			doInBackground();
			mHandler.post(new Runnable() {
				@Override
				public void run() {
					onFinished();
				}
			});
		}

	}

	public static abstract class ProgressBackgroundTask extends BackgroundTask {

		public interface ProgressListener {
			public void onProgress(ProgressBackgroundTask task, int value,
					int max, String description);
		}

		private ProgressListener mListener;

		public void setProgressListener(ProgressListener listener) {
			mListener = listener;
		}

		public void postProgress(final int value, final int max,
				final String description) {
			if (mListener != null) {
				mHandler.post(new Runnable() {
					@Override
					public void run() {
						mListener.onProgress(ProgressBackgroundTask.this,
								value, max, description);
					}
				});
			}
		}
	}

	public static InputStream getPhoneLogs() throws IOException,
			InterruptedException {
		ProcessBuilder builder = new ProcessBuilder("logcat", "-d");
		builder.redirectErrorStream(true);
		Process process = builder.start();
		// process.waitFor();
		return process.getInputStream();
	}
}